package ar.unq.edu.persistencia.gpilla.daos;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.LogicalExpression;
import org.hibernate.criterion.PropertyExpression;
import org.hibernate.criterion.SimpleExpression;

import ar.edu.unq.persistencia.gpilla.Equipo;
import ar.edu.unq.persistencia.gpilla.PartidoSimple;
import ar.edu.unq.persistencia.gpilla.hibernate.SessionManager;

/**
 * TODO: description
 */
@SuppressWarnings("deprecation")
public class PartidoSimpleDAO {

    /**
     * Devuelve todos los encuentros de los dos equipos pasados por parámetro, de visitante y local
     * */
    @SuppressWarnings("unchecked")
    static public List<PartidoSimple> getPartidos(final Equipo equipo1, final Equipo equipo2) {

        Session session = SessionManager.getInstancia().getSession();
        Criteria criteria = session.createCriteria(PartidoSimple.class);
        SimpleExpression id_eq_uno_l = Expression.eq("local", equipo1);
        SimpleExpression id_eq_dos_l = Expression.eq("local", equipo2);
        SimpleExpression id_eq_uno_v = Expression.eq("visita", equipo1);
        SimpleExpression id_eq_dos_v = Expression.eq("visita", equipo2);
        LogicalExpression and1 = Expression.and(id_eq_uno_l, id_eq_dos_v);
        LogicalExpression and2 = Expression.and(id_eq_dos_l, id_eq_uno_v);
        LogicalExpression or = Expression.or(and1, and2);
        criteria.add(or);
        List<PartidoSimple> retorno = criteria.list();
        return retorno;
    }

    @SuppressWarnings("unchecked")
    static public List<PartidoSimple> getPartidosEmpates() {

        Session session = SessionManager.getInstancia().getSession();
        Criteria criteria = session.createCriteria(PartidoSimple.class);
        PropertyExpression esEmpate = Expression.eqProperty("golesLocal", "golesVisita");
        criteria.add(esEmpate);
        List<PartidoSimple> retorno = criteria.list();
        return retorno;
    }

    @SuppressWarnings("unchecked")
    static public List<Object[]> getPartidosSQL(final Integer equipo1, final Integer equipo2) {
        Session session = SessionManager.getInstancia().getSession();
        Query q = session.createSQLQuery("SELECT * FROM partido_simple where " + "((id_equipo_local = " + equipo1
                + " and id_equipo_visita = " + equipo2 + ") or (id_equipo_local = " + equipo2
                + " and id_equipo_visita = " + equipo1 + ")) ");
        List<Object[]> retorno = q.list();

        return retorno;
    }

    @SuppressWarnings("unchecked")
    static public List<Object[]> getPartidosEmpatesEE() {
        // traee los partidos empatados, A, B cant
        // B,A,cant2
        Session session = SessionManager.getInstancia().getSession();
        Query q = session
                .createQuery("select p.local, p.visita, count(*) as cantidad from PartidoSimple p where p.golesLocal = p.golesVisita group by p.local, p.visita");
        q.setCacheable(true);
        List<Object[]> retorno = q.list();
        return retorno;
    }

}
